' "Ghost Game" by Charlie Veniot ' Based on the "40 Line Game Revised" by b+, mod of some game 2022-03-18 new way to score _Title "Ghost Game" Dim As Long sw, sh, goalR, hx, hy, i, hits, score, stars, nEnemies sw = 640: sh = 480: nEnemies = 35: goalR = -1: hx = 10: hy = 400 ' hero stuff (you) ghostWidth% = 20 ghostHeight% = 18 Dim EX(nEnemies), EY(nEnemies), EC(nEnemies) As Long ' enemy stuff DIM eyeDirection%(nEnemies), ghostEyeball$(nEnemies), ghostIris$(nEnemies), irisColor&(nEnemies) DIM MoveUpKey% = ASC("P"), MoveDownKey% = ASC("L"), MoveLeftKey% = ASC("A"), MoveRightKey% = ASC("S") PRINT "Keyboard keys used for movement:" PRINT PRINT "P for UP, L for DOWN, A for LEFT, S for RIGHT" PRINT PRINT "Are these okay? Press the [N] key to redefine the movement key." A$ = INPUT$(1) IF UCASE$(A$) = "N" THEN GOSUB ⚙RedefineKeys SLEEP _INITAUDIO SCREEN _NEWIMAGE(sw, sh, 32) ghostBod$ = _ ".......XXXXXX......." + _ ".....XXXXXXXXXX....." + _ "...XXXXXXXXXXXXXX..." + _ "..XXXXXXXXXXXXXXXX.." + _ ".XXXXXXXXXXXXXXXXXX." + _ ".XXXXXXXXXXXXXXXXXX." + _ ".XXXXXXXXXXXXXXXXXX." + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXXXXXXXXXXXXXXXXXXX" + _ "XXX..XXXX..XXXX..XXX" + _ "XX....XX....XX....XX" + _ "XX....XX....XX....XX" ghostEyeballLeft$ = _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ "..XXXX.....XXXX....." + _ "XXXXXXX..XXXXXXX...." + _ "X...XXX..X...XXX...." + _ "X...XXX..X...XXX...." + _ "X...XXX..X...XXX...." + _ ".XXXXX....XXXXX....." + STRING$(8*20,".") ghostEyeballRight$ = _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ ".....XXXX.....XXXX.." + _ "....XXXXXXX..XXXXXXX" + _ "....XXX...X..XXX...X" + _ "....XXX...X..XXX...X" + _ "....XXX...X..XXX...X" + _ ".....XXXXXX...XXXXXX" + STRING$(8*20,".") ghostIrisLeft$ = _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ ".XXX......XXX......." + _ ".XXX......XXX......." + _ ".XXX......XXX......." + STRING$(8*20,".") ghostIrisRight$ = _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ "...................." + _ ".......XXX......XXX." + _ ".......XXX......XXX." + _ ".......XXX......XXX." + STRING$(8*20,".") For i = 1 To 1000 PSet (Int(Rnd * sw), Int(Rnd * sh)), _RGB32(55 + Rnd * 200, 55 + Rnd * 200, 55 + Rnd * 200) Next PCOPY 0 , 1 For i = 1 To nEnemies EX(i) = Int(Rnd * (sw - 20) + 10): EY(i) = -2 * sh * Rnd + sh: EC(i) = _RGB32(55 + Rnd * 200, 55 + Rnd * 200, 55 + Rnd * 200) eyeDirection% = INT(RND*2) ghostEyeball$(i) = IFF(eyeDirection%,ghostEyeballLeft$,ghostEyeballRight$) ghostIris$(i) = IFF(eyeDirection%,ghostIrisLeft$,ghostIrisRight$) irisColor&(i) = IFF(INT(RND*2), &h0000FF, &h964B00) Next Do ' thisKey$ = inkey$ Cls PCOPY 1, 0 Print "Hits:"; hits, "Score:"; score Line (hx - 10, hy - 10)-Step(20, 20), &hFFFF00, B If hx >= sw - 13 And goalR Then score = score + 100: goalR = 0 If hx <= 13 And goalR = 0 Then score = score + 100: goalR = -1 For i = 1 To nEnemies ' the enemies ' Circle (EX(i), EY(i)), 10, EC(i) FOR thisY = 1 TO ghostHeight% FOR thisX = 1 TO ghostWidth% IF MID$(ghostBod$, (thisY-1) * ghostWidth% + thisX, 1) <> "." THEN PSET (EX(i)+thisX, EY(i)+thisY), EC(i) IF MID$(ghostEyeball$(i), (thisY-1) * ghostWidth% + thisX, 1) <> "." THEN PSET (EX(i)+thisX, EY(i)+thisY), &hFFFFFF IF MID$(ghostIris$(i), (thisY-1) * ghostWidth% + thisX, 1) <> "." THEN PSET (EX(i)+thisX, EY(i)+thisY), irisColor&(i) NEXT thisX NEXT thisY If Sqr((EX(i) + 10 - hx) ^ 2 + (EY(i) + 9 - hy) ^ 2) < 20 Then 'collision Sound 2000, 3: hits = hits + 1 EX(i) = Int(Rnd * 600 + 20): EY(i) = -_Height * Rnd ' move that bad boy! If hits = 10 Then Print "Too many hits, goodbye!": _Delay 10 End If EY(i) = EY(i) + Int(Rnd * 5) If EY(i) > 461 Then EX(i) = Int(Rnd * 600 + 20): EY(i) = -sh * Rnd Next If KEYSTATE(MoveDownKey%) Then hy = hy + 2 If KEYSTATE(MoveUpKey%) Then hy = hy - 2 If KEYSTATE(MoveLeftKey%) Then hx = hx - 2 If KEYSTATE(MoveRightKey%) Then hx = hx + 2 If hx < 10 Then hx = 10 If hx > sw - 10 Then hx = sw - 10 If hy < 10 Then hy = 10 If hy > sh - 10 Then hy = sh - 10 _Display Loop ⚙RedefineKeys: WHILE keyState(): WEND CLS PRINT "Redefine keys for movement." PRINT PRINT "Press (and then release) a keyboard key for the moving UP action." DO : MoveUpKey% = keyState() : LOOP WHILE MoveUpKey% = 0 WHILE keyState(): WEND ' DIM MoveUpKey% = ASC("P"), MoveDownKey% = ASC("L"), MoveLeftKey% = ASC("A"), MoveRightKey% = ASC("S") RETURN